<?php

class GrupoConhecimento
{
	
	private $idGrupo;
	private $grupo;
	private $areas = array();
	
	public function GrupoConhecimento($idGrupo) {
		$strQuery	=	"SELECT * FROM gruposConhecimento WHERE idGrupo = " . $idGrupo . ";";
		
		$resultado	=	BancoDados::query($strQuery);
		
		if (is_array($resultado)) {
			$this->setIdGrupo($idGrupo);
			$this->setGrupo($resultado[0]['grupo']);
			
			if ($areasConhecimento	=	AreaConhecimento::buscar($idGrupo)) {
				foreach ($areasConhecimento['listaResultados'] as $chave => $area) {
					if ($area['area'] == 'Outra') {
						unset($areasConhecimento['listaResultados'][$chave]);
						array_push($areasConhecimento['listaResultados'], $area);
					}
				}
				$this->setAreas($areasConhecimento['listaResultados']);
			}
			else
				$this->setIdGrupo(null);
		}
		else {
			$this->setIdGrupo(null);
		}
	}
	
	public static function inserir($grupo) {
		if (GrupoConhecimento::valida($grupo)) {
			$strQuery	=	'LOCK TABLES gruposConhecimento WRITE;';
			
			if ($conexao = BancoDados::conectaBD()) {
				$strQuery	=	'INSERT INTO gruposConhecimento VALUES(default, "' . $grupo . '");';
				if (BancoDados::query($strQuery, $conexao)) {
					$strQuery	=	'SELECT idGrupo FROM gruposConhecimento ORDER BY idGrupo DESC LIMIT 1;';
					if (is_array($resultado = BancoDados::query($strQuery, $conexao))) {
						BancoDados::desconectaBD($conexao);
						$idGrupo 	=	$resultado[0]['idGrupo'];
						
						if (AreaConhecimento::inserir($idGrupo, 'Outra', true)) {
							return true;
						}
						else {
							return false;
						}
					}
					else {
						BancoDados::desconectaBD($conexao);
						return false;
					}
				}
				else {
					BancoDados::desconectaBD($conexao);
					return false;
				}
			}
			else {
				return false;
			}
		}
		else {
			return false;
		}
	}
	
	public static function apagar($idGrupo) {
		$strQuery	=	'DELETE FROM gruposConhecimento WHERE idGrupo = ' . $idGrupo . ';';
		
		return	BancoDados::query($strQuery);
	}
	
	public static function valida($grupo) {
		$valida	=	true;
		
		if (!validaAlfabetico($grupo, constant('__TAM_NOME_GRUPO_DE_CONHECIMENTO__'))) {
			adicionaMensagem(texto('MENSAGEM_ERRO_VALIDACAO_GRUPO_DE_CONHECIMENTO', array($grupo)));
			$valida	=	false;
		}
		
		return $valida;
	}
	
	/**
	 * Retorna os Grupos de Conhecimento disponiveis
	 * @return 
	 * @param object $ordem
	 * @param object $paginaAtual
	 */
	public static function buscar ($strGrupo = NULL, $ordenacaoAtual = NULL, $ordemAtual = NULL, $resultadosPagina = NULL, $paginaAtual = NULL) {
		if (GrupoConhecimento::validarBusca($strGrupo)) {
			$strQuery	=	'SELECT gruposConhecimento.*, COUNT(areasConhecimento.idArea) AS qtdAreas FROM gruposConhecimento LEFT JOIN areasConhecimento ON gruposConhecimento.idGrupo = areasConhecimento.idGrupo WHERE ';
			
			//ADICIONANDO EXPRESSOES REGULARES (SE HOUVEREM) NA QUERY
			$arrayGrupo		=	$strGrupo != null ? explode(' ', $strGrupo) : array();
			foreach ($arrayGrupo as $grupo) {
				$strQuery	.=	'gruposConhecimento.grupo REGEXP ".*' . $grupo . '.*" AND ';
			}
			
			//CONSERTANDO FINAL DA QUERY
			$strQuery	=	preg_replace('/ WHERE $/', ' ', $strQuery);
			$strQuery	=	preg_replace('/ AND $/', ' ', $strQuery);
			
			$strQuery	.=	'GROUP BY gruposConhecimento.idGrupo ';
			
			$strQueryCount	=	'SELECT COUNT(*) AS qtdResultados FROM (' . $strQuery . ') AS queryOriginal;';

			$resultadoCount	=	BancoDados::query($strQueryCount);
			if(is_array($resultadoCount)) {
				foreach($resultadoCount as $resultado) {
					$qtdResultados	=	$resultado['qtdResultados'];
				}
				
				if ($qtdResultados > 0) {
					$paginaAtual	=	$paginaAtual == NULL ? 1 : $paginaAtual;
					$ordenacaoAtual	=	$ordenacaoAtual == NULL ? 'grupo' : $ordenacaoAtual;
					$ordemAtual		=	$ordemAtual == NULL ? 'ASC' : ($ordemAtual == 'desc' ? 'DESC' : 'ASC');
					
					$strQuery	.=	' ORDER BY ' . $ordenacaoAtual . ' ' . $ordemAtual;
					
					if ($resultadosPagina != NULL) {
						$qtdPaginas		=	ceil($qtdResultados / $resultadosPagina);
						$qtdPaginas		=	$qtdPaginas == 0 ? 1 : $qtdPaginas;
						
						$strQuery		.=	' LIMIT ' . $resultadosPagina . ' OFFSET ' . (($paginaAtual - 1) * $resultadosPagina);
					}
					else {
						$qtdPaginas	=	1;
					}
					
					$strQuery	.=	';';
					
					$resultado	=	BancoDados::query($strQuery);
					
					if (is_array($resultado)) {
						return array ('listaResultados' => $resultado, 'qtdResultadosTotal' => $qtdResultados, 'qtdPaginas' => $qtdPaginas);
					}
					else {
						return false;
					}
				}
				else {
					return array('listaResultados' => array(), 'qtdResultadosTotal' => 0, 'qtdPaginas' => 0);
				}
			}
			else {
				return false;
			}
		}
		else {
			return false;
		}
	}
	
	public static function validarBusca ($grupo) {
		$valida	=	true;
		
		if (!validaAlfabetico($grupo, constant('__TAM_NOME_GRUPO_DE_CONHECIMENTO__')) && $grupo != '') {
			adicionaMensagem(texto('MENSAGEM_ERRO_VALIDACAO_GRUPO_DE_CONHECIMENTO', array($grupo)));
			$valida	=	false;
		}
		
		return $valida;
	}
	
	public function setIdGrupo ($idGrupo) {
		$this->idGrupo	=	$idGrupo;
	}
	
	public function getIdGrupo () {
		return $this->idGrupo;
	}
	
	public function setGrupo ($grupo) {
		$this->grupo	=	$grupo;
	}
	
	public function getGrupo () {
		return $this->grupo;
	}
	
	public function setAreas($areas) {
		$this->areas	=	$areas;
	}
	
	public function adicionaArea($idArea, $area) {
		array_push($this->areas, array('idArea' => $idArea, 'idGrupo' => $this->getIdGrupo(), 'area' => $area));
	}
	
	/**
	 * 
	 * @param bool $exibir [optional]
	 * @return 
	 */
	public function getAreas($exibir = false) {
		if ($exibir) {
			$listaAreas	=	$this->areas;
			
			$areaOutra	=	array_pop($listaAreas);
			$areaOutra['area']	=	texto('DADOS_OUTRA_AREA_DE_CONHECIMENTO');
			array_push($listaAreas, $areaOutra);
			
			return $listaAreas;
		}
		else {
			return $this->areas;
		}
	}
}

?>